用c++11封装win32界面库

您所在的位置:网站首页 c++ 封装成库 用c++11封装win32界面库

用c++11封装win32界面库

2024-07-14 17:36| 来源: 网络整理| 查看: 265

0. 前言  你是否也是一个c++玩家,经常用c++写一些带界面的小程序?厌倦了每次在vs里用鼠标拖各种控件,然后copy / paste一大堆win32的api?没用过mfc,wtl,qt,只用sdk? 本文介绍一种方法把这些api进行封装,弄一个界面库出来,当然前提是对这些api有基本了解。

  之前看过些界面库源码,尤其是egui,好多东西都是从它那学来的。它们都用到像boost这种第三方库,因为当时c++版本没有自带shared_ptr,lambda,functional这些工具, c++11之后包含了这大部分东西,也就不需要第三方库了,但需要较新的编译器。下面的源码可以用MinGW编译,或者vs2012+November 2012 CTP  补丁(vs2012不支持xp)。

下载:https://files.cnblogs.com/aj3423/gui.rar

1. 介绍  就称这界面库叫 _gui 吧,整个 _gui 可以分为以下几部分

  1. thunk  封装wnd_proc这种回调函数

  2. property 类似vb的属性  win->enabled = false;  edit->text = "xxx";

  3. event  事件  btn->event.click += []() { cout title = "new_title"; //会调用 set_title("new_title")

  这样对外只要访问属性 title 就好了,按权限分为 property::r  property::w  property::rw,有没有感觉简洁一些。(详见 property.h)

 

4 event

btn->event.click += on_btn_click_1; btn->event.click += []() { cout client_rect; for(auto& c : ch) { // 通常只有一个子窗口 c->rect = r; } } }; }

 比如本文最开头图中的垂直分割布局 vsplit:

// layout/split.h namespace layout { struct vsplit : base { wnd sp; // 分隔条 vsplit(int offset) { sp = 创建vsplitter; } virtual void apply(wnd_ptr& p, vector& ch) { std::call_once(第一次布局时在容器p上画出 sp 分隔条); ch[0]->rect = 分隔条左边区域大小; // splitter sp->rect = ..;// 拉伸分隔条高度 = 容器高度 ch[1]->rect = 分隔条右边区域大小; } }; } 总之在 apply 内可以实现所有布局,比如可以做一套传统的java布局,我没有考虑实现那些,觉得不够通用。以经典 border 为例,支持5个东西以 "东南西北中" 放置,但要多于5个它就不支持了,除非用嵌套 panel 的方法, 既浪费内存,代码也不易读。

需要一个更通用的布局。

我google了老半天,发觉两个还不错 1. PageLayout A Layout Manager for Java Swing/AWT  (http://pagelayout.sourceforge.net/)     它的 doc 里说道  PageLayout: The Only Layout Manager You Will Ever Need

2. DesignGridLayout for java (http://designgridlayout.java.net/)    如果装了java,可以直接运行他的demo (http://designgridlayout.java.net/examples.jnlp)

但还是感觉不够通用,还要记一大堆api。

把 layout 问题抽象,其实可以看做一个线性约束问题。比如一个窗口,宽度是W,它包含左右两部分,左边宽度是右边两倍,可以描述成:

w1 == 2 * 2w; // 左边宽度是右边两倍 w1 + w2 == W; // 总宽度是W

 或者固定宽度100:

w1 == 100; 或者播放器保持 16:9 比例,最小宽度200 w / h = 16 / 9; w >= 200;

这样一来,布局问题就变成了数学问题,通过解n元一次方程组就能算出每个控件的位置和大小。以后布局就不用记什么 layout api了,直接给几个公式就ok。Auckland Layout 就是这么做的,看了它的demo后又发觉个问题,太不直观了。。

继续寻找,发现最直观的是这个 Eva Layout,就写了个layout::eva:

可以用各大IDE的列模式编辑eva表格,vim的话还有插件可以格式化竖线: easy_align

最后

 如果觉得太素就加个win7 style:

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")

目前的进度也就到这,只有一个大致框架,准备改成mvc的,然后用到什么控件就改进什么。

有建议请联系, 企鹅号 94566062

good luck



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3